package org.footballmanager.pandafootball.system.service.impl;

import org.footballmanager.pandafootball.common.BaseDao;
import org.footballmanager.pandafootball.common.annotation.SystemServiceLog;
import org.footballmanager.pandafootball.common.constants.Constants;
import org.footballmanager.pandafootball.system.domain.BsccAndJfEntity;
import org.footballmanager.pandafootball.system.domain.FootBfinfo;
import org.footballmanager.pandafootball.system.service.FootZjService;
import org.footballmanager.pandafootball.system.service.RepeatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;

/**
 * 服务抽象类
 * 用于抽象出一些已知的服务，如根据主键获取唯一记录、保存记录等方法
 * 继承此类可以省去 大部分重复代码
 *
 * @author chenjian
 * @since 2017年9月27日上午10:57:28
 */
public abstract class RepeatMainServiceImpl<T extends BsccAndJfEntity> extends ServiceImpl<T> implements RepeatService<T> {
    @Autowired
    BaseDao<T> baseDao;
    @Autowired
    private FootZjService footZjService;

    /**
     * 保存记录
     *
     * @param entity  参数
     * @param request 参数
     * @return 返回值
     */
    @Override
    @Transactional
    @SystemServiceLog(description = "保存记录")
    public int save(T entity, HttpServletRequest request) {
        /*根据胜平负球数算出:
		场次（带过来） = 报分次数
		胜平负相加 （带过来） = 场次
		进球（带过来）=所有报分里这个球队进球累加
		失球（带过来）=所有报分里这个球队失球累加
		净胜球 = 进球-失球
		胜率 = 胜 ÷ 场次
		积分 = 胜*3 + 平*1 + 负*0  */
        entity.setJf(entity.getS() * 3 + entity.getP());
        if (request != null) {
            entity.setCreateId((Long) request.getSession().getAttribute(Constants.USERID));
            entity.setUpdateId((Long) request.getSession().getAttribute(Constants.USERID));
        }
        entity.setCreateTime(new Date());
        entity.setUpdateTime(new Date());
        return baseDao.insert(entity);
    }

    /**
     * 更新记录
     *
     * @param entity  参数
     * @param request 请求
     * @return 是否成功
     */
    @Override
    @Transactional
    @SystemServiceLog(description = "更新记录")
    public int updateNotNull(T entity, HttpServletRequest request) {
        entity.setJf(entity.getS() * 3 + entity.getP());
        int result = super.updateNotNull(entity, request);
        this.reComputeRanking(request);
        return result;
    }

    /**
     * 重新计算排名
     *
     * @param request 请求
     */
    @SystemServiceLog(description = "重新计算排名")
    public abstract void reComputeRanking(HttpServletRequest request);

    /**
     * 根据用户主键获取记录
     *
     * @param userId 用户主键
     * @return 记录
     */
    @Override
    @SystemServiceLog(description = "根据用户主键获取记录")
    public abstract T findByUserid(Long userId);

    /**
     * 报分确认后更新数据
     *
     * @param bf      报分实体类
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "报分确认后更新数据")
    public void addEncourage(FootBfinfo bf, HttpServletRequest request) {
        T zhufc = this.findByUserid(bf.getQd1());
        T kefc = this.findByUserid(bf.getQd2());
        processAdd(zhufc, kefc, bf, request);
        this.updateNotNull(zhufc, request);
        this.updateNotNull(kefc, request);
    }

    /**
     * 处理报分后续功能加分
     *
     * @param zhufc   主场球队
     * @param kefc    客场球队
     * @param bf      报分实体
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "处理报分后续功能加分")
    public void processAdd(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
        //俱乐部排行数据更新
        if (zhufc != null && kefc != null) {
            zhufc.setBscc(zhufc.getBscc() + 1);
            kefc.setBscc(kefc.getBscc() + 1);

            if (bf.getJq1() > bf.getJq2()) {
                //2代表主队胜利,1代表平,0代表主队负
                zhufc.setJf(zhufc.getJf() + 3);
                zhufc.setS(zhufc.getS() + 1);
                kefc.setF(kefc.getF() + 1);
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 2, true, bf.getBflx(), request);
            } else if (bf.getJq1().equals(bf.getJq2())) {
                zhufc.setJf(zhufc.getJf() + 1);
                zhufc.setP(zhufc.getP() + 1);
                kefc.setJf(kefc.getJf() + 1);
                kefc.setP(kefc.getP() + 1);
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 1, true, bf.getBflx(), request);
            } else {
                zhufc.setF(zhufc.getF() + 1);
                kefc.setJf(kefc.getJf() + 3);
                kefc.setS(kefc.getS() + 1);
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 0, true, bf.getBflx(), request);
            }
        }
    }

    /**
     * 删除报分后更新数据
     *
     * @param bf      报分实体
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "删除报分后更新数据")
    public void deleteEncourage(FootBfinfo bf, HttpServletRequest request) {
        T zhufc = this.findByUserid(bf.getQd1());
        T kefc = this.findByUserid(bf.getQd2());
        processDelete(zhufc, kefc, bf, request);
        this.updateNotNull(zhufc, request);
        this.updateNotNull(kefc, request);
    }

    /**
     * 处理报分后续功能减分
     *
     * @param zhufc   主场球队
     * @param kefc    客场球队
     * @param bf      报分实体
     * @param request 请求
     */
    @Override
    @SystemServiceLog(description = "处理报分后续功能减分")
    public void processDelete(T zhufc, T kefc, FootBfinfo bf, HttpServletRequest request) {
        //俱乐部排行数据更新
        if (zhufc != null && kefc != null) {
            zhufc.setBscc(zhufc.getBscc() - 1);
            kefc.setBscc(kefc.getBscc() - 1);

            if (bf.getJq1() > bf.getJq2()) {
                //2代表主队胜利,1代表平,0代表主队负
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 2, false, bf.getBflx(), request);
                zhufc.setJf(zhufc.getJf() - 3);
                zhufc.setS(zhufc.getS() - 1);
                kefc.setF(kefc.getF() - 1);
            } else if (bf.getJq1().equals(bf.getJq2())) {
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 1, false, bf.getBflx(), request);
                zhufc.setP(zhufc.getP() - 1);
                zhufc.setJf(zhufc.getJf() - 1);
                kefc.setJf(kefc.getJf() - 1);
                kefc.setP(kefc.getP() - 1);
            } else {
                footZjService.getMoney(bf.getQd1(), bf.getQd2(), 0, false, bf.getBflx(), request);
                zhufc.setF(zhufc.getF() - 1);
                kefc.setJf(kefc.getJf() - 3);
                kefc.setS(kefc.getS() - 1);
            }
        }
    }

}
